home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #3 / Amiga Plus CD - 2002 - No. 03.iso / AmiSoft / Hard / Drivr / 3c589.lha / 3c589 / Source / device.h < prev    next >
C/C++ Source or Header  |  2003-01-26  |  5KB  |  240 lines

  1. /*
  2.  
  3. Copyright (C) 2001,2002 Neil Cafferkey
  4.  
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9.  
  10. This program is distributed in the hope that it will be useful, but
  11. WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  18. MA 02111-1307, USA.
  19.  
  20. */
  21.  
  22. #ifndef DEVICE_H
  23. #define DEVICE_H
  24.  
  25.  
  26. #include <exec/types.h>
  27. #include <exec/devices.h>
  28. #include <devices/sana2.h>
  29. #include <devices/sana2specialstats.h>
  30. #include <resources/card.h>
  31. #include <libraries/pccard.h>
  32. #include <devices/timer.h>
  33.  
  34. #ifndef UPINT
  35. typedef ULONG UPINT;
  36. typedef LONG PINT;
  37. #endif
  38.  
  39. #ifdef __mc68000
  40. #define REG(A) __asm(A)
  41. #else
  42. #define REG(A)
  43. #endif
  44.  
  45. #define USE_HACKS
  46.  
  47.  
  48. struct DevBase
  49. {
  50.    struct Device device;
  51.    APTR seg_list;
  52.    struct ExecBase *sys_base;
  53.    APTR card_base;
  54.    struct UtilityBase *utility_base;
  55.    struct Library *pccard_base;
  56.    struct MinList units;
  57.    struct timerequest timer_request;
  58. };
  59.  
  60.  
  61. enum
  62. {
  63.    WRITE_QUEUE,
  64.    ADOPT_QUEUE,
  65.    EVENT_QUEUE,
  66.    GENERAL_QUEUE,
  67.    REQUEST_QUEUE_COUNT
  68. };
  69.  
  70. #define ADDRESS_SIZE 6
  71. #define HEADER_SIZE 14
  72. #define PREAMBLE_SIZE 4
  73. #define PACKET_DEST 0
  74. #define PACKET_SOURCE 6
  75. #define PACKET_TYPE 12
  76. #define PACKET_DATA 14
  77. #define MTU 1500
  78. #define MAX_PACKET_SIZE ((HEADER_SIZE)+(MTU))
  79.  
  80. #define STAT_COUNT 3
  81.  
  82.  
  83. struct DevUnit
  84. {
  85.    struct MinNode node;
  86.    ULONG unit_num;
  87.    ULONG open_count;
  88.    UWORD flags;
  89.    UWORD transceiver;
  90.    struct Task *task;
  91.    struct MsgPort *request_ports[REQUEST_QUEUE_COUNT];
  92.    struct DevBase *device;
  93.    struct CardHandle *card_handle;
  94.    UBYTE *tuple_buffer;
  95.    UBYTE *rx_buffer;
  96.    UBYTE *tx_buffer;
  97.    volatile UBYTE *config_base;
  98.    volatile UBYTE *io_base;
  99.    ULONG card_removed_signal;
  100.    ULONG card_inserted_signal;
  101.    ULONG range_count;
  102.    UBYTE address[ADDRESS_SIZE];
  103.    UBYTE default_address[ADDRESS_SIZE];
  104.    struct MinList openers;
  105.    struct MinList type_trackers;
  106.    struct MinList multicast_ranges;
  107.    struct Interrupt rx_int;
  108.    struct Interrupt tx_int;
  109.    struct Sana2DeviceStats stats;
  110.    ULONG special_stats[STAT_COUNT];
  111.    struct SignalSemaphore access_lock;
  112.    UWORD rx_filter_cmd;
  113. };
  114.  
  115.  
  116. struct Opener
  117. {
  118.    struct MinNode node;
  119.    struct MsgPort read_port;
  120.    BOOL (*rx_function)(APTR REG("a0"),APTR REG("a1"),ULONG REG("d0"));
  121.    BOOL (*tx_function)(APTR REG("a0"),APTR REG("a1"),ULONG REG("d0"));
  122.    ULONG *(*dma_tx_function)(APTR REG("a0"));
  123.    struct Hook *filter_hook;
  124.    struct MinList initial_stats;
  125. };
  126.  
  127.  
  128. struct TypeStats
  129. {
  130.    struct MinNode node;
  131.    ULONG packet_type;
  132.    struct Sana2PacketTypeStats stats;
  133. };
  134.  
  135.  
  136. struct TypeTracker
  137. {
  138.    struct MinNode node;
  139.    ULONG packet_type;
  140.    struct Sana2PacketTypeStats stats;
  141.    ULONG user_count;
  142. };
  143.  
  144.  
  145. struct AddressRange
  146. {
  147.    struct MinNode node;
  148.    ULONG add_count;
  149.    ULONG lower_bound_left;
  150.    ULONG upper_bound_left;
  151.    UWORD lower_bound_right;
  152.    UWORD upper_bound_right;
  153. };
  154.  
  155.  
  156. /* Unit flags */
  157.  
  158. #define UNITF_SHARED (1<<0)
  159. #define UNITF_ONLINE (1<<1)
  160. #define UNITF_HAVECARD (1<<2)
  161. #define UNITF_HAVEADAPTER (1<<3)
  162. #define UNITF_CONFIGURED (1<<4)
  163. #define UNITF_PROM (1<<5)
  164.  
  165.  
  166. IMPORT const TEXT device_name[];
  167.  
  168. #define HANDLE_PRIORITY 10
  169.  
  170. #define S2_3C589_WRITEEEPROM 0x998f
  171.  
  172.  
  173. /* Endianness macros */
  174.  
  175. #define BEWord(A)\
  176.    (A)
  177.  
  178. #define MakeBEWord(A)\
  179.    (A)
  180.  
  181. #define LEWord(A)\
  182.    (((A)<<8)|((A)>>8))
  183.  
  184. #define MakeLEWord(A)\
  185.    (((A)<<8)|((A)>>8))
  186.  
  187. #define BELong(A)\
  188.    (A)
  189.  
  190. #define MakeLELong(A)\
  191.    ((MakeLEWord((A)&0xffff)<<16)|(MakeLEWord((A)>>16)))
  192.  
  193.  
  194. /* I/O macros */
  195.  
  196. #define ByteIn(address)\
  197.    (*((volatile UBYTE *)(address)))
  198.  
  199. #define ByteOut(address,value)\
  200.    *((volatile UBYTE *)(address))=(value)
  201.  
  202. #define WordIn(address)\
  203.    (*((volatile UWORD *)(address)))
  204.  
  205. #define WordOut(address,value)\
  206.    *((volatile UWORD *)(address))=(value)
  207.  
  208. #define BEWordOut(address,value)\
  209.    *((volatile UWORD *)(address))=(value)
  210.  
  211. #define LEWordOut(address,value)\
  212.    *((volatile UWORD *)(address))=(UWORD)(((value)<<8)|((value)>>8))
  213.  
  214. #define LongIn(address)\
  215.    (*((volatile ULONG *)(address)))
  216.  
  217. #define LongOut(address,value)\
  218.    *((volatile ULONG *)(address))=(value)
  219.  
  220. #define LELongOut(address,value)\
  221.    LongOut(address,MakeLELong(value))
  222.  
  223.  
  224. /* Library and device bases */
  225.  
  226. #define SysBase (base->sys_base)
  227. #define CardResource (base->card_base)
  228. #define UtilityBase (base->utility_base)
  229. #define PCCardBase (base->pccard_base)
  230. #define TimerBase (base->timer_request.tr_node.io_Device)
  231.  
  232. #ifndef BASE_REG
  233. #define BASE_REG "a6"
  234. #endif
  235.  
  236. /*register APTR base asm(BASE_REG);*/
  237.  
  238.  
  239. #endif
  240.